package eu.hellek.gba.server.TaskQueue; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; import com.google.appengine.api.quota.QuotaService; import com.google.appengine.api.quota.QuotaServiceFactory; import com.google.appengine.api.taskqueue.DeferredTask; import com.google.appengine.api.taskqueue.DeferredTaskContext; import com.googlecode.objectify.Key; import com.googlecode.objectify.Objectify; import eu.hellek.gba.model.Line; import eu.hellek.gba.model.Point; import eu.hellek.gba.model.TrainNode; import eu.hellek.gba.server.dao.Dao; import eu.hellek.gba.server.dao.ManagementDao; import eu.hellek.gba.server.utils.Utils; public class AddTrainTask implements DeferredTask { private static final long serialVersionUID = 1L; private String payload; public AddTrainTask(String payload) { this.payload = payload; } /** * Format von String points: lat,lon,Strassenname,ignore als float,float,string ohne beistrich,boolean(0/1) * Die ersten 3 Felder: Nummer, Ramal und ob zug/ubahn oder bus (nur bei letzteren werden zwischenpunkte erstellt) * danach: x,y,uniqueName,Name (coordinaten einer station, der linien�bergreifende name der station, der f�r die aktuelle linie g�ltige Name) */ @Override public void run() { DeferredTaskContext.setDoNotRetry(true); String functionName = "AddTrainTask"; try { QuotaService qs = QuotaServiceFactory.getQuotaService(); long starttime = qs.getCpuTimeInMegaCycles(); String points = payload; String[] parts = points.split(Pattern.quote(",")); Line l = null; List<Point> pointsList = new ArrayList<Point>(); if(parts[2].equals("subte")) { if(parts[0].contains("Metrobus")) { l = new Line(parts[0], parts[1], 13); } else if(parts[0].contains("Premetro")) { l = new Line(parts[0], parts[1], 15); } else { l = new Line(parts[0], parts[1], 11); } } else if(parts[2].equals("tren")) { l = new Line(parts[0], parts[1], 21); } Objectify ofy = Dao.getInstance().getObjectify(); if(ManagementDao.getInstance().checkIfLineExists(l, ofy)) { throw new Exception("Line already exists: " + l); } ManagementDao.getInstance().addLine(l, ofy); TrainNode lastNode = null; // Key knLast = null; int start = 3; // felder 0,1,2 sind diese extradaten, ab feld 3 kommen die punkte for(int i = start; i<parts.length; i=i+4) { float a = Float.valueOf(parts[i]); float b = Float.valueOf(parts[i+1]); Point p = new Point(parts[i+2], a, b, new Key<Line>(Line.class, l.getId())); // com.beoui.geocell.model.Point _p = new com.beoui.geocell.model.Point(a,b); String cell = Utils.computeGeoCell(p); TrainNode n = new TrainNode(cell, cell, parts[i+3], parts[i+2], new Key<Line>(Line.class, l.getId()), l.getType(), pointsList.size(), Dao.getRootEntityTrain()); Key<TrainNode> kN = ManagementDao.getInstance().addTrainNode(n); if(lastNode != null) { lastNode.setNextNode(kN); ManagementDao.getInstance().updateTrainNode(lastNode); // n.addConnectedNode(knLast); // Dao.getInstance().addOrUpdateTrainNode(n); } lastNode = n; if(i>=start+2) { Point lastPoint = pointsList.get(pointsList.size()-1); lastPoint.setNextMainPointIndex(pointsList.size()); } p.setIndex(pointsList.size()); pointsList.add(p); } ManagementDao.getInstance().safePoints(pointsList, ofy); long endtime = qs.getCpuTimeInMegaCycles(); double cpuSeconds = qs.convertMegacyclesToCpuSeconds(endtime - starttime); Logger.getLogger(functionName).log(Level.FINEST, functionName + ": " + cpuSeconds + " CPU seconds"); Logger.getLogger(functionName).log(Level.INFO, functionName + ": added Train " + l); } catch (Exception e) { Logger.getLogger(functionName).log(Level.SEVERE, functionName + ": " + e); Logger.getLogger(functionName).log(Level.SEVERE, functionName + ": Payload was: " + payload); e.printStackTrace(); Utils.eMailError(e, functionName); } } }